﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace FileSystemBrowser
{
    /*
     *  программа запрашивает у пользователя путь к 
     *  директории и выводит все файлы и директории в указанной пользователем директории. 
     */

    class Program
    {

        /// <summary>
        /// returns a lists of files and a directories
        /// in a selected directory
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
     private static FilesAndDirectoryLists getFilesAndDirectories (string path)
    {
        //очередь хранит пути к директориям
        Queue<string> directoryQueue = new Queue <string>();
        
        List<string> fileList = new List<string>();
        List<string> directoryList = new List<string>();

        //существует ли такая директория?
        if(!Directory.Exists (path))
        {
            return null;
        }

        //добавить путь к исходной директории в очередь
         directoryQueue.Enqueue(path);
         directoryList.Add(path);

         while (directoryQueue.Count != 0)
         {
             //извлекаем последний элемент из очереди
             directoryQueue.Dequeue();

             //получаем список файлов
             string[] directoryFiles = System.IO.Directory.GetFiles(path);
             //добавляем их в список
             foreach (string file in directoryFiles)
             {
                 fileList.Add(file);

             }

            //получаем список поддиректорий для данного элемента
             string[] subDirectories = System.IO.Directory.GetDirectories(path);
            //добавляем данные директории в очередь
             foreach (string directory in subDirectories)
             {
                 directoryQueue.Enqueue(directory);
                 directoryList.Add(directory);

             }
             


         }
         return new FilesAndDirectoryLists(fileList, directoryList);
    }


     private static void OutputList(List<string> fileList)
     {
         foreach (string file in fileList)
         {
             Console.WriteLine(file);
         }
         

     }
        static void Main(string[] args)
        {
            Console.WriteLine("Введите путь к директории");
            string path = Console.ReadLine();
            FilesAndDirectoryLists list = getFilesAndDirectories(path);
            if (null == list)
            {
                Console.WriteLine("Path is incorrent");
            }
            else
            {
                Console.WriteLine("File list:");
                OutputList(list.FileList);
                Console.WriteLine("Directory list:");
                OutputList(list.DirectoryList);
            }
        }
    }
}
